﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Data.SqlClient;

namespace LI4.Data
{
    class Curso
    {
        private Ligacao ligacao;

        public Curso()
        {
            ligacao = new Ligacao();
        }

        public int inserir(Business.Curso curso)
        {
            string descricao = "Inseriu curso: " + curso.Nome + ".";
            SqlParameter[] paramts = new SqlParameter[15];
            string data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            paramts[0] = new SqlParameter();
            paramts[0].ParameterName = "@return_value";
            paramts[0].SqlDbType = System.Data.SqlDbType.Int;
            paramts[0].Direction = System.Data.ParameterDirection.ReturnValue;

            paramts[1] = new SqlParameter("@nome", curso.Nome);
            paramts[2] = new SqlParameter("@cod_area", curso.Area.Cod_Area);
            paramts[3] = new SqlParameter("@rua", curso.Rua);
            paramts[4] = new SqlParameter("@cod_postal", curso.CodPostal);
            paramts[5] = new SqlParameter("@descricao", curso.Descricao);
            paramts[6] = new SqlParameter("@nr_inscritos", curso.Nrinscritos);
            paramts[7] = new SqlParameter("@total_vagas", curso.Totalvagas);
            paramts[8] = new SqlParameter("@remuneracao", curso.Remuneracao);
            paramts[9] = new SqlParameter("@cod_localidade", curso.Localidade.CodLocalidade);
            paramts[10] = new SqlParameter("@latitude", curso.Latitude);
            paramts[11] = new SqlParameter("@longitude", curso.Longitude);
            paramts[12] = new SqlParameter("@registoD", descricao);
            paramts[13] = new SqlParameter("@data", data);
            paramts[14] = new SqlParameter("@userOp", Program.Login.Username);

            try
            {
                ligacao.runProcedure("dbo.inserirCurso", paramts);
            }
            catch { }

            return (int)ligacao.mySqlCommand.Parameters[0].Value;
        }

        public int update(Business.Curso curso)
        {
            string descricao = "Editou curso: " + curso.Nome + ".";
            SqlParameter[] paramts = new SqlParameter[16];
            string data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            paramts[0] = new SqlParameter();
            paramts[0].ParameterName = "@return_value";
            paramts[0].SqlDbType = System.Data.SqlDbType.Int;
            paramts[0].Direction = System.Data.ParameterDirection.ReturnValue;

            paramts[1] = new SqlParameter("@cod_curso", curso.CodCurso);
            paramts[2] = new SqlParameter("@nome", curso.Nome);
            paramts[3] = new SqlParameter("@cod_area", curso.Area.Cod_Area);
            paramts[4] = new SqlParameter("@rua", curso.Rua);
            paramts[5] = new SqlParameter("@cod_postal", curso.CodPostal);
            paramts[6] = new SqlParameter("@descricao", curso.Descricao);
            paramts[7] = new SqlParameter("@nr_inscritos", curso.Nrinscritos);
            paramts[8] = new SqlParameter("@total_vagas", curso.Totalvagas);
            paramts[9] = new SqlParameter("@remuneracao", curso.Remuneracao);
            paramts[10] = new SqlParameter("@cod_localidade", curso.Localidade.CodLocalidade);
            paramts[11] = new SqlParameter("@latitude", curso.Latitude);
            paramts[12] = new SqlParameter("@longitude", curso.Longitude);
            paramts[13] = new SqlParameter("@registoD", descricao);
            paramts[14] = new SqlParameter("@data", data);
            paramts[15] = new SqlParameter("@userOp", Program.Login.Username);

            try
            {
                ligacao.runProcedure("dbo.updateCurso", paramts);
            }
            catch { }

            return (int)ligacao.mySqlCommand.Parameters[0].Value;
        }

        public int remover(Business.Curso c)
        {

            string descricao = "Removeu curso: " + c.Nome + ".";
            SqlParameter[] paramts = new SqlParameter[2];
            string data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            paramts[0] = new SqlParameter();
            paramts[0].ParameterName = "@return_value";
            paramts[0].SqlDbType = System.Data.SqlDbType.Int;
            paramts[0].Direction = System.Data.ParameterDirection.ReturnValue;

            paramts[1] = new SqlParameter("@cod_curso", c.CodCurso);

            try
            {
                ligacao.runProcedure("dbo.removerCurso", paramts);
            }
            catch { }

            return (int)ligacao.mySqlCommand.Parameters[0].Value;
        }

        public Business.Curso getCurso(int codigo)
        {
            Business.Curso curso = null;
            SqlDataReader reader;

            ligacao.Select("SELECT Cursos.cod_curso, Cursos.nome, Cursos.cod_area,Cursos.rua,Cursos.cod_postal,Cursos.descricao,Cursos.total_vagas,Cursos.nr_inscritos,Cursos.total_vagas,Cursos.remuneracao,Cursos.cod_localidade,Cursos.latitude,Cursos.Longitude,Area.nome as nome_area, Localidades.nome as nome_local,Distritos.nome as nome_dist,Distritos.cod_distrito FROM Cursos,Area,Localidades,distritos where Cursos.cod_area=Area.cod_area and Cursos.cod_localidade=Localidades.cod_localidade and Distritos.cod_distrito=localidades.cod_distrito");
            reader = ligacao.mySqlDataReader;

            reader.Read();

            Business.Distrito dist = new LI4.Business.Distrito((int)reader["cod_distrito"], reader["nome_dist"].ToString());
            Business.Localidade local = new LI4.Business.Localidade((int)reader["cod_localidade"], dist, reader["nome_local"].ToString());
            Business.Area area = new Business.Area((int)reader["cod_area"], reader["nome_area"].ToString());

            curso = new Business.Curso(reader["nome"].ToString(), (int)reader["cod_curso"], area, reader["cod_postal"].ToString(), reader["rua"].ToString(), reader["descricao"].ToString(),
                (int)reader["total_vagas"], (int)reader["nr_inscritos"], (int)reader["remuneracao"], local, reader["latitude"].ToString(), reader["longitude"].ToString());


            reader.Close();


            return curso;
        }

        public ArrayList getCursos()
        {
            ArrayList array = new ArrayList();
            SqlDataReader reader;

            ligacao.Select("SELECT Cursos.cod_curso, Cursos.nome, Cursos.cod_area,Cursos.rua,Cursos.cod_postal,Cursos.descricao,Cursos.total_vagas,Cursos.nr_inscritos,Cursos.total_vagas,Cursos.remuneracao,Cursos.cod_localidade,Cursos.latitude,Cursos.Longitude,Area.nome as nome_area, Localidades.nome as nome_local,Distritos.nome as nome_dist,Distritos.cod_distrito FROM Cursos,Area,Localidades,distritos where Cursos.cod_area=Area.cod_area and Cursos.cod_localidade=Localidades.cod_localidade and Distritos.cod_distrito=localidades.cod_distrito");
            reader = ligacao.mySqlDataReader;

            while (reader.Read())
            {
                Business.Distrito dist = new LI4.Business.Distrito((int)reader["cod_distrito"], reader["nome_dist"].ToString());
                Business.Localidade local = new LI4.Business.Localidade((int)reader["cod_localidade"], dist, reader["nome_local"].ToString());
                Business.Area area = new Business.Area((int)reader["cod_area"], reader["nome_area"].ToString());

                array.Add(new Business.Curso(reader["nome"].ToString(), (int)reader["cod_curso"], area, reader["cod_postal"].ToString(), reader["rua"].ToString(), reader["descricao"].ToString(),
                    (int)reader["total_vagas"], (int)reader["nr_inscritos"], (int)reader["remuneracao"], local, reader["latitude"].ToString(), reader["longitude"].ToString()));
            }

            reader.Close();
            return array;
        }

        public bool existeCandidatoCurso(string username, int cod_curso)
        {
            SqlDataReader reader;

            ligacao.Select("SELECT username FROM cursos_inscritos where username='" + username + "' and cod_curso='" + cod_curso + "';");
            reader = ligacao.mySqlDataReader;
            bool existe = reader.Read();


            reader.Close();

            return existe;
        }

        public ArrayList getCursosCod()
        {

            ArrayList array = new ArrayList();

            SqlDataReader reader;

            ligacao.Select("SELECT Cursos.cod_curso, Cursos.nome, Cursos.cod_area,Cursos.rua,Cursos.cod_postal,Cursos.descricao,Cursos.total_vagas,Cursos.nr_inscritos,Cursos.total_vagas,Cursos.remuneracao,Cursos.cod_localidade,Cursos.latitude,Cursos.longitude,Area.nome as nome_area, Localidades.nome as nome_local,Distritos.nome as nome_dist,Distritos.cod_distrito FROM Cursos,Area,Localidades,distritos where Cursos.cod_area=Area.cod_area and Cursos.cod_localidade=Localidades.cod_localidade and Distritos.cod_distrito=localidades.cod_distrito ORDER BY cod_curso");

            reader = ligacao.mySqlDataReader;

            while (reader.Read())
            {
                Business.Distrito dist = new LI4.Business.Distrito((int)reader["cod_distrito"], reader["nome_dist"].ToString());
                Business.Localidade local = new LI4.Business.Localidade((int)reader["cod_localidade"], dist, reader["nome_local"].ToString());
                Business.Area area = new Business.Area((int)reader["cod_area"], reader["nome_area"].ToString());

                array.Add(new Business.Curso(reader["nome"].ToString(), (int)reader["cod_curso"], area, reader["cod_postal"].ToString(), reader["rua"].ToString(), reader["descricao"].ToString(),

                    (int)reader["total_vagas"], (int)reader["nr_inscritos"], (int)reader["remuneracao"], local, reader["latitude"].ToString(), reader["longitude"].ToString()));
            }

            reader.Close();

            return array;
        }

        public ArrayList getCursosNome(string nomec)
        {
            ArrayList array = new ArrayList();
            SqlDataReader reader;

            
            ligacao.Select("select * from cursos where nome like '%" + nomec + "%'");
            reader = ligacao.mySqlDataReader;

            while (reader.Read())
            {

                int cod_curso = reader.GetInt32(0);
                string nome = reader.GetString(1);
                int cod_area = reader.GetInt32(2);
                Data.Area areap = new Data.Area();
                Business.Area area = new Business.Area(areap.getArea(cod_area));
                string morada = reader.GetString(3);
                string cod_pos = reader.GetString(4);
                string descricao = reader.GetString(5);
                int nr_inscritos = reader.GetInt32(6);
                int total_vagas = reader.GetInt32(7);
                int renumeracao = reader.GetInt32(8);
                int cod_loc = reader.GetInt32(9);
                Data.Localidade locald = new Data.Localidade();
                Business.Localidade localidade = new Business.Localidade(locald.getLocalidade(cod_loc));
                string latitute = reader.GetString(10);
                string longitude = reader.GetString(11);


                Business.Curso curso = new Business.Curso(nome, cod_curso, area, cod_pos, morada, descricao, total_vagas, nr_inscritos, renumeracao, localidade, latitute, longitude);
                
                
                array.Add(curso);
                
            }

            reader.Close();
            return array;
        }

        public ArrayList getCursosLocalidade(int localidadec)
        {
            ArrayList array = new ArrayList();
            SqlDataReader reader;


            ligacao.Select("select * from cursos where cod_localidade ='" + localidadec + "'");
            reader = ligacao.mySqlDataReader;

            while (reader.Read())
            {

                int cod_curso = reader.GetInt32(0);
                string nome = reader.GetString(1);
                int cod_area = reader.GetInt32(2);
                Data.Area areap = new Data.Area();
                Business.Area area = new Business.Area(areap.getArea(cod_area));
                string morada = reader.GetString(3);
                string cod_pos = reader.GetString(4);
                string descricao = reader.GetString(5);
                int nr_inscritos = reader.GetInt32(6);
                int total_vagas = reader.GetInt32(7);
                int renumeracao = reader.GetInt32(8);
                int cod_loc = reader.GetInt32(9);
                Data.Localidade locald = new Data.Localidade();
                Business.Localidade localidade = new Business.Localidade(locald.getLocalidade(cod_loc));
                string latitute = reader.GetString(10);
                string longitude = reader.GetString(11);


                Business.Curso curso = new Business.Curso(nome, cod_curso, area, cod_pos, morada, descricao, total_vagas, nr_inscritos, renumeracao, localidade, latitute, longitude);


                array.Add(curso);

            }

            reader.Close();
            return array;
        }

        public ArrayList getCursosArea(int areac)
        {
            ArrayList array = new ArrayList();
            SqlDataReader reader;


            ligacao.Select("select * from cursos where cod_area ='" + areac + "'");
            reader = ligacao.mySqlDataReader;

            while (reader.Read())
            {

                int cod_curso = reader.GetInt32(0);
                string nome = reader.GetString(1);
                int cod_area = reader.GetInt32(2);
                Data.Area areap = new Data.Area();
                Business.Area area = new Business.Area(areap.getArea(cod_area));
                string morada = reader.GetString(3);
                string cod_pos = reader.GetString(4);
                string descricao = reader.GetString(5);
                int nr_inscritos = reader.GetInt32(6);
                int total_vagas = reader.GetInt32(7);
                int renumeracao = reader.GetInt32(8);
                int cod_loc = reader.GetInt32(9);
                Data.Localidade locald = new Data.Localidade();
                Business.Localidade localidade = new Business.Localidade(locald.getLocalidade(cod_loc));
                string latitute = reader.GetString(10);
                string longitude = reader.GetString(11);


                Business.Curso curso = new Business.Curso(nome, cod_curso, area, cod_pos, morada, descricao, total_vagas, nr_inscritos, renumeracao, localidade, latitute, longitude);


                array.Add(curso);

            }

            reader.Close();
            return array;
        }


        public Business.Curso getCursoNome(string nomec)
        {
            SqlDataReader reader;
            Business.Curso curs = new Business.Curso();

            ligacao.Select("SELECT Cursos.cod_curso, Cursos.nome, Cursos.cod_area,Cursos.rua,Cursos.cod_postal,Cursos.descricao,Cursos.total_vagas,Cursos.nr_inscritos,Cursos.total_vagas,Cursos.remuneracao,Cursos.cod_localidade,Cursos.latitude,Cursos.Longitude,Area.nome as nome_area, Localidades.nome as nome_local,Distritos.nome as nome_dist,Distritos.cod_distrito FROM Cursos,Area,Localidades,distritos where Cursos.nome like '%" + nomec + "%'");
            reader = ligacao.mySqlDataReader;

            if (reader.Read())
            {
                Business.Distrito dist = new LI4.Business.Distrito((int)reader["cod_distrito"], reader["nome_dist"].ToString());
                Business.Localidade local = new LI4.Business.Localidade((int)reader["cod_localidade"], dist, reader["nome_local"].ToString());
                Business.Area area = new Business.Area((int)reader["cod_area"], reader["nome_area"].ToString());

                curs = new Business.Curso(reader["nome"].ToString(), (int)reader["cod_curso"], area, reader["cod_postal"].ToString(), reader["rua"].ToString(), reader["descricao"].ToString(),
                    (int)reader["total_vagas"], (int)reader["nr_inscritos"], (int)reader["remuneracao"], local, reader["latitude"].ToString(), reader["longitude"].ToString());
            }

            reader.Close();
            return curs;
        }
    }
}
